#include "InvertFilter.h"
#include "FilterException.h"
#include <cv.h>

using namespace cv;

InvertFilter::InvertFilter(){}

void InvertFilter::process(const Mat& src, Mat& dst)
{
	//chequeo que el tipo de matrices sea válido
	//if (! (src.type() == CV_8UC1 || src.type() == CV_32FC1))
	//	throw FilterException("src debe ser de tipo CV_8UC1 o CV_32FC1");
	if (src.type() != dst.type() || src.size() != dst.size())
		throw FilterException("dst debe ser del mismo tipo y tamaño que src");

    vector<Mat> planes;
    split(src, planes);

	for(int i = 0; i < src.rows; ++i)
	{
	    for(unsigned int k = 0; k < planes.size(); ++k)
	    {
			uchar* ptrP = planes[k].ptr<uchar>(i);
			for(int j = 0; j < src.cols; ++j)
				ptrP[j] = (uchar)(ptrP[j] ^ 0xFFFF);
		}
	}

	merge(planes, dst);
}
